/**
 * 定义vnode类型相关结构
 *
 * 相关方法 
 * render,createElement,h
 * diff,patch
 * 
 * 随之要设计Vnode各个参数的对应update，因为diff的时候一定会涉及到每个小部分的更新
 *  
 */

 let count=0

 function generateKey(){
  
    return `key_${count++}`
 
 }

 export class VNode{
     
    /**
     * 
     * @param {*} sel  用来标识vnode的类型标签 < # [ 
     * @param {*} data  用来标识vnode相关属性
     * @param {*} children [] 用来标识对应的数组
     * @param {*} elm vnode对应的真实dom
     * @param {*} text vnode text内容
     * @param {*} key 需要用key来作为唯一标识来提高diff效率
     */
    constructor(sel=undefined,data=new VNodeData(),children=[],elm=undefined,text=undefined,key){

         this.sel=sel
         this.data=data
         this.children=children
         this.elm=elm
         this.text=text   
         this.key=key||generateKey()

    }
     
 }


 export class VNodeData{

    constructor(option){

       this.props=this.attrs=this.className=this.style=this.hook=this.dataset=this.key=null
  
       Object.assign(this,option) 

    }

 }

 export function checkIsVnode(...args){
    return args.some(it=>!(it instanceof Vnode))
 }
